延續 Day 21「第一次建立 ASP.NET Core Web API」及 Day 22「規劃智慧醫院資料庫」,今天開始進行 ASP.NET Core 與 Oracle Database 的實際連線。
前面已經完成主要 Angular 前端頁面,也建立了 ASP.NET Core Web API,並規劃七張資料表及 ERD。
不過,目前後端只有簡單的 HelloController,還沒有真正連接資料庫。
因此 Day 23 的目標,就是讓 ASP.NET Core 可以透過 Oracle 驅動程式,使用一般開發帳號連接 Oracle Database,執行簡單 SQL 並取得結果。
本次主要目標:
SELECT 1 FROM DUAL。本次只完成資料庫連線,不執行 Day 22 的七張資料表 DDL,也不實作正式醫師查詢或預約掛號 API。
Day 22 已經完成智慧醫院平台的初版資料庫設計。
當時主要規劃七張資料表:
| 資料表 | 用途 |
|---|---|
| Users | 會員帳號與聯絡資訊 |
| Patients | 實際就診者 |
| Departments | 科別 |
| Doctors | 醫師 |
| DoctorSpecialties | 醫師專長 |
| DoctorSchedules | 門診排班與名額 |
| Appointments | 預約紀錄 |
當時也完成了資料字典、主鍵與外鍵、Mermaid ERD,以及 Oracle SQL DDL 草稿。
但這些成果仍然只是設計文件。
真正的資料庫還沒有建立上述七張資料表,ASP.NET Core 也還沒有和 Oracle 連線。
因此今天先不急著建立所有資料表,而是從最基本的資料庫連線開始。
我希望先確認:
等這些都成功後,未來才能進一步實作醫師查詢、預約掛號及資料庫 CRUD。
開始操作之前,我先釐清 Oracle Database、SQL Developer 與 Oracle .NET 驅動程式的差異。
Oracle Database 是真正負責儲存及管理資料的資料庫系統。
未來智慧醫院的會員、醫師、門診及預約資料,都會保存在資料庫中。
SQL Developer 是用來連接及管理 Oracle Database 的工具。
可以透過它:
但 SQL Developer 本身不是資料庫伺服器。
ASP.NET Core 不能直接使用 SQL Developer 的連線設定來存取資料庫。
它需要透過適合 .NET 的 Oracle 驅動程式,建立自己的資料庫連線。
這次開始了解,資料庫可以由不同客戶端連接:
SQL Developer
│
├────────→ Oracle Database
│
ASP.NET Core Web API
│
└────────→ Oracle Database
SQL Developer 成功連線,不代表 ASP.NET Core 已經成功串接。
因此兩個階段都需要分別測試。
這次先檢查電腦原本的 Oracle 安裝狀態。
檢查後確認,Oracle Database 與 Listener 服務都已經在執行。
Listener 顯示 orcl 服務處於 READY 狀態。
另外,也確認本機已經有 SQL*Plus 工具。
之後透過 SQL Developer 查詢,確認實際 Oracle 環境:
| 項目 | 實際結果 |
|---|---|
| Oracle Database | 19c Enterprise Edition |
| 資料庫版本 | 19.3.0.0.0 |
| Database Name | ORCL |
| CDB | NO |
| Host | localhost |
| Port | 1521 |
| Service Name | orcl |
這次第一次接觸到 Oracle 的 CDB 與 PDB 概念。
CDB 是 Container Database,PDB 則是 Pluggable Database。
透過查詢:
SELECT name, cdb
FROM v$database;
得到:
NAME CDB
---- ---
ORCL NO
表示目前使用的是非 CDB 架構。
因此這次不需要另外尋找可插拔資料庫 PDB。
確認資料庫架構後,才比較清楚後續應該使用哪個 Oracle Service。
這次在 SQL Developer 設定連線時,遇到一個之前沒有特別注意的地方。
Oracle 連線設定中,可以看到:
原本建立的 SQL Developer 連線名稱為:
SmartCare-Local
而實際使用的設定是:
Hostname:localhost
Port:1521
SID:orcl
一開始容易將連線名稱、SID 與 Service Name 混在一起。
但這三個概念並不相同。
只是 SQL Developer 裡自己設定的連線名稱。
用來識別 Oracle 資料庫執行個體。
用來識別客戶端要連接的資料庫服務。
為了確認實際 Service Name,這次執行:
SELECT name, network_name
FROM v$services;
查詢結果包含:
orcl
orclXDB
SYS$BACKGROUND
SYS$USERS
其中確認 orcl 是可用於本機資料庫連線的服務名稱。
因此後續 ASP.NET Core 的 Oracle 連線規劃,使用:
Host:localhost
Port:1521
Service Name:orcl
這次也學到,設定資料庫連線時不能只看 SQL Developer 的連線名稱,而是應該確認真正的資料庫服務資訊。
第一次成功連線 SQL Developer 時,我使用的是 Oracle 的管理員帳號。
執行:
SELECT USER FROM DUAL;
結果為:
SYS
當時的連線角色是:
SYSDBA
雖然已經可以成功查詢 Oracle,但這並不適合作為智慧醫院後端的正式連線方式。
因為 SYS 是具有高度管理權限的帳號,主要用於資料庫管理工作。
如果讓一般 Web API 使用這種帳號,將會賦予應用程式不必要的資料庫權限。
因此這次決定另外建立智慧醫院專用的開發帳號。
希望做到:
這也是這次第一次實際接觸「最小權限原則」的地方。
確認 Oracle 資料庫環境後,接著準備智慧醫院專用的開發帳號。
帳號名稱規劃為:
SMARTCARE_DEV
建立前,先檢查資料庫中是否已經存在相同帳號:
SELECT username, account_status
FROM dba_users
WHERE username LIKE '%SMARTCARE%'
ORDER BY username;
檢查後沒有找到既有的 SMARTCARE_DEV 帳號,因此才進行新的開發帳號建立。
這次建立的是一般資料庫使用者,而不是另一個資料庫。
接著授予最基本的連線權限:
GRANT CREATE SESSION TO SMARTCARE_DEV;
CREATE SESSION 允許使用者建立資料庫工作階段,也就是登入 Oracle。
這次還沒有授予建立正式醫院資料表需要的權限。
因為今天只是連線測試,不需要提前提供大量權限。
另外,建立帳號時使用的密碼由我在本機自行設定,沒有寫入專案原始碼或文章。
完成帳號建立後,接著在 SQL Developer 建立新的連線。
這次使用:
| 項目 | 設定 |
|---|---|
| Connection Name | SmartCare-Dev |
| Username | SMARTCARE_DEV |
| Role | Default |
| Connection Type | Basic |
| Hostname | localhost |
| Port | 1521 |
| Service Name | orcl |
這次和之前最大的差異,是不再使用 SYS/SYSDBA。
建立連線後,點擊 Test,成功通過。
執行:
SELECT USER FROM DUAL;
結果:
SMARTCARE_DEV
代表已經使用開發專用帳號登入。
接著執行:
SELECT 1 FROM DUAL;
結果:
1
這代表目前的開發帳號可以成功連接 Oracle Database,並執行基本查詢。
不過這時只完成 SQL Developer 的連線測試,還沒有完成 ASP.NET Core 串接。
連線成功截圖:

查詢截圖:


確認 Oracle 本身可以連線後,接著回到 ASP.NET Core 專案。
這次需要讓 C# 程式與 Oracle Database 溝通,因此開始學習 ADO.NET。
ADO.NET 是 .NET 應用程式存取資料來源的一組技術與介面。
它可以透過資料提供者,建立連線、執行 SQL 並取得結果。
這次使用 Oracle 對應的 .NET 驅動程式:
Oracle.ManagedDataAccess.Core
因為 ASP.NET Core 本身不會自動知道應該如何與 Oracle Database 溝通。
因此需要適合 Oracle 的資料提供者。
本次主要學習兩個類別:
OracleConnection
負責建立及管理 Oracle 資料庫連線。
OracleCommand
負責將 SQL 指令交給 Oracle 執行。
這次先從簡單的 ADO.NET 查詢開始,沒有直接使用 Entity Framework Core 或 DbContext。
我希望先理解資料庫連線與 SQL 執行的基本過程,再學習更完整的資料存取架構。
ASP.NET Core 要連接 Oracle,需要知道資料庫在哪裡,以及應該使用哪個帳號。
因此這次也開始了解 Connection String(連線字串)。
連線字串通常需要包含:
本次的非敏感設定包括:
Host:localhost
Port:1521
Service Name:orcl
Username:SMARTCARE_DEV
密碼則另外保存。
如果直接將 Oracle 密碼寫入 Program.cs 或其他準備提交到 GitHub 的檔案,就可能不小心將密碼公開。
尤其這個專案除了開發功能,也是準備放到 GitHub 的學習作品集。
因此這次特別將密碼管理與程式碼分開。
這次使用 ASP.NET Core 的 User Secrets 保存本機開發需要的 Oracle 密碼。
User Secrets 可以將開發用敏感設定存放在專案原始碼目錄之外。
這樣不需要直接將密碼寫入:
Program.cs
appsettings.json
GitHub
不過 User Secrets 本身並不是加密保險箱,主要用途是降低開發密碼被意外提交到版本控制的風險。
正式部署時仍需要使用更適合的機密管理方式。
這次 Codex 準備了一個密碼設定腳本:
tools/set-day23-oracle-secret.ps1
這個腳本會要求在本機終端機輸入 SMARTCARE_DEV 密碼,再將設定提供給 .NET User Secrets。
由於涉及密碼,這個操作需要由我自己在本機執行。
這次沒有把密碼貼進 Codex 對話,也沒有將完整連線字串輸出到日誌。
在設定 User Secrets 時,這次實際遇到一個問題。
原本要在 PowerShell 執行:
pwsh -NoProfile -File .\tools\set-day23-oracle-secret.ps1
但終端機出現錯誤:
pwsh : 無法辨識 'pwsh' 詞彙是否為 Cmdlet、
函數、指令檔或可執行程式的名稱。
一開始需要確認是不是沒有安裝 PowerShell 7。
後來檢查發現,電腦其實已經安裝 PowerShell 7,只是沒有加入 PATH。
| 項目 | 版本 |
|---|---|
| Windows PowerShell | 5.1.26100.9767 |
| PowerShell 7 | 7.5.1 |
PowerShell 7 的實際位置:
C:\Program Files\PowerShell\7\pwsh.exe
因此問題不是 PowerShell 7 不存在,而是終端機無法直接透過 pwsh 找到它。
後來改成使用完整路徑執行:
& "C:\Program Files\PowerShell\7\pwsh.exe" -NoProfile -File "C:\Users\Sy\Smart-Hospital2\tools\set-day23-oracle-secret.ps1"
這樣不需要重新安裝 PowerShell 7,也不需要立即修改 PATH。
另外,因為腳本本身使用 PowerShell 7 的功能,所以不能直接改成 Windows PowerShell 5.1 執行。
這次讓我了解到,執行指令失敗不一定代表工具沒有安裝,也可能和系統環境變數有關。
修正 PowerShell 的執行方式後,重新執行密碼設定腳本。
依照提示,在本機終端機輸入 SMARTCARE_DEV 的密碼。
完成後顯示:
Oracle password saved
這代表密碼設定步驟已經成功。
不過,這時還不能直接認定資料庫串接完成。
因為成功保存 User Secrets,只表示 ASP.NET Core 已經具備讀取連線設定的條件。
仍然需要透過 C# 真正開啟 OracleConnection,執行 SQL,才能驗證整個資料庫連線流程。
這也是本次將「設定成功」與「連線成功」分開測試的原因。
完成設定後,開始進行這次最重要的部分:讓 ASP.NET Core 透過 C# 連接 Oracle。
本次採用最小 ADO.NET 方式,不使用 EF Core。
主要流程:
ASP.NET Core Web API
↓
讀取 User Secrets 中的連線設定
↓
OracleConnection
↓
開啟 Oracle 資料庫連線
↓
OracleCommand
↓
執行 SELECT 1 FROM DUAL
↓
取得查詢結果
↓
回傳 JSON
OracleConnection 負責管理 C# 程式與 Oracle Database 之間的連線。
這次學到,建立連線物件與真正開啟連線是不同的動作。
只有當程式實際開啟連線時,才會嘗試與 Oracle 進行通訊。
連線成功後,接著透過 OracleCommand 執行 SQL。
這次使用:
SELECT 1 FROM DUAL;
因為它不需要事先建立 Users、Doctors 或 Appointments 等資料表。
這讓本次測試可以專注在資料庫連線本身,而不會受到尚未建立的業務資料表影響。
資料庫連線會使用系統及資料庫資源。
因此程式應該在操作完成後正確釋放連線,不應讓不再使用的連線一直佔用資源。
這次也開始認識 C# 資源管理的重要性。
(這裡建議放入 ORACLE-DAY23.md 中實際的 OracleConnection 與 OracleCommand 程式碼截圖,避免以示意程式取代真正寫入專案的內容。)
為了驗證 ASP.NET Core 是否能成功連接 Oracle,這次加入了專門的 Oracle 診斷 API。
這支 API 的主要用途不是處理醫師或預約資料,而是測試:
本次只執行:
SELECT 1 FROM DUAL;
沒有執行任何新增、修改或刪除資料的 SQL。
而且資料庫診斷功能應限制在本機開發環境,不應作為正式系統公開的診斷入口。
完成 C# 連線功能後,接著進行實際測試。
這次由 ASP.NET Core Web API 發送 Oracle 查詢,成功取得結果。
| 項目 | 結果 |
|---|---|
| Oracle 診斷 API | HTTP 200 |
| 使用帳號 | SMARTCARE_DEV |
| SQL | SELECT 1 FROM DUAL |
| 查詢結果 | 1 |
| 回傳格式 | JSON |
實際回傳:
{
"status": "ok",
"value": 1
}
其中:
"status": "ok"
表示診斷 API 回報測試成功。
而:
"value": 1
表示 Oracle SQL 查詢實際取得了數值 1。
這次已經不只是 SQL Developer 可以連線。
而是 ASP.NET Core Web API 本身已經透過 Oracle .NET 驅動,成功向 Oracle Database 發送 SQL,並取得查詢結果。
這也是 Day 23 最重要的成果。
建議截圖:
(放入 Oracle 診斷 API 回傳 JSON 的畫面)
完成 Oracle 連線後,還需要確認原本的 ASP.NET Core 專案沒有因為新增功能而受到影響。
這次執行後端建置。
結果:
Build succeeded.
0 Warning(s)
0 Error(s)
表示目前新增的 Oracle 連線程式沒有造成編譯錯誤。
原本 Day 21 建立的:
GET /api/hello
仍然成功回傳 HTTP 200,且 JSON 內容正確。
新增的 Oracle 診斷功能也成功回傳 HTTP 200。
這次另外確認原本 Angular 與 HelloController 等受保護檔案沒有受到修改。
實際結果:
133 個檔案一致
0 個變更
因此 Day 23 主要新增的是 Oracle 資料庫連線相關功能,沒有修改原本的 Angular UI 或 HelloController。
雖然 ASP.NET Core 已經成功連接 Oracle,但這次仍然沒有建立 Day 22 規劃的七張資料表。
目前完成的是:
ASP.NET Core
↓
Oracle Database
↓
SELECT 1 FROM DUAL
↓
回傳 1
尚未完成的是:
ASP.NET Core
↓
Oracle Database
↓
Users / Doctors / Appointments
↓
讀取正式資料
這兩個階段不能混為一談。
今天證明了資料庫連線與簡單查詢可以正常運作。
但尚未驗證:
這些都會留到後續階段再處理。
這次主要學習:
這次最大的學習,是理解資料庫連線並不只是輸入帳號密碼,而是包含資料庫服務確認、權限管理、驅動程式、連線設定與程式測試等不同環節。
本次使用 Codex 協助:
本次已完成:
這次整理的文件包括:
docs/
├── ORACLE-DAY23.md
├── DAY23-TECHNICAL-SUMMARY.md
├── day23-environment-check.json
├── day23-hello-test-results.json
└── day23-oracle-test-results.json
其中 ORACLE-DAY23.md 保存分階段教學與 C# 程式碼解釋,其他檔案則記錄環境確認與實際測試結果。
成果截圖:
SQL Developer 的 SMARTCARE_DEV 連線設定:

SELECT USER FROM DUAL 與 SELECT 1 FROM DUAL 的結果:


Oracle 連線相關 C# 程式碼:

Oracle 診斷 API 回傳 JSON:

dotnet build 成功結果:

這次已經完成智慧醫院管理平台 ASP.NET Core Web API 與 Oracle Database 的第一次實際連線。
從 Day 21 建立第一支 API,到 Day 22 規劃七張資料表,再到 Day 23 成功查詢 Oracle,後端開發開始有了更完整的基礎。
目前資料庫連線已經可以正常運作,但尚未真正建立智慧醫院需要的業務資料表。
接下來希望逐步完成:
另外,因為目前專案目錄仍無法辨識為 Git Repository,所以這次尚未進行 Commit。
等確認正確版本庫後,可以將 Day 23 的資料庫連線功能獨立提交,建議使用:
feat(api): add Oracle database connectivity
這次最大的收穫,是第一次讓自己建立的 ASP.NET Core Web API 真正連接到 Oracle Database。
也讓我更清楚了解,前端畫面、Web API 與資料庫之間如何逐步建立真正的資料流通。